package com.kx.talk.service;

import com.kx.talk.pojo.FriendGroup;
import com.kx.talk.vo.FriendRequestAddVO;
import com.kx.talk.vo.FriendVO;
import com.kx.talk.vo.PolicyVO;

import java.util.List;

/**
 * @Author Sun
 * @Date 2021/7/28 19:29
 */
public interface FriendService {
    /**
     * 注册成为好友模块的用户
     * @param userId 用户id
     * @return 数据库操作结果
     */
    int insertFriendBase(Long userId);

    /**
     * 查询所有的添加好友时需要执行的策略
     * @return  所有的好友策略
     */
    List<PolicyVO> selectPolicies();


    /**
     * 修改用户的好友添加策略
     * @param userId 用户id
     * @param policyId 好友策略的id
     * @param question 验证问题
     * @param answer 验证问题的答案
     * @param password 好友验证的密码
     * @return 返回数据库操作结果
     */
    int updatePolicyByUid(Long userId, Integer policyId, String question, String answer, String password);

    /**
     * 添加好友的方法
     * @param userId 用户id
     * @param wantId 想要加的好友的id
     * @param message 附带的信息
     *                附带信息会结合wantId用户的friend_ship_policy_id
     *                的值来实现其含义：
     *                friend_ship_policy_id   含义
     *                1                       无意义
     *                2                       验证问题的答案
     *                3                       好友验证的密码
     *                4                       好友验证的信息
     *                5                       无意义
     * @param groupId 好友分组的组的id
     * @return
     *          0   代表未添加成功
     *          1   代表添加成功
     *          2   代表等待确认
     */
    int addFriend(Long userId, Long wantId, String message, Integer groupId);

    /**
     * 答复好友添加的方法
     * @param id  请求主键id
     * @param userId  当前的登录用户id
     * @param state  1 同意 2 拒绝
     * @param groupId  分组id
     * @return 请求人的id
     */
    Long askRequest(Long id, Long userId, Integer state, Long groupId);

    /**
     * 查询所有好友请求的方法
     * 分页数据查询
     * @param userId 当前的登录用户id
     * @param lastItemId 上一页最后一个条目的id，如果是第一页，此值为null
     * @param pageSize 页大小
     * @return 请求对象的集合
     */
    List<FriendRequestAddVO> selectRequestByPage(Long userId, Integer lastItemId, Integer pageSize);

    /**
     * 根据用户id查询所有分组
     * @param userId 当前登录的用户id
     * @return
     */
    List<FriendGroup> selectGroupsByUserId(Long userId);

    /**
     * 创建好友分组的方法
     * 注意：好友分组最多10个@GROUP_NUM_MAX=10
     * @param userId 用户id
     * @param groupName 用户指定的组的名称
     * @return 0 创建失败
     *         1 创建成功
     *         2 组数量已经达到上限
     *         3 指定的组名已经存在
     */
    int createGroup(Long userId, String groupName);

    /**
     * 编辑好友进入到指定的组中
     * @param userId 用户id
     * @param friendId 好友的id
     * @param groupId 组的id
     * @return
     *          0  移动失败
     *          1  移动成功
     *          2  指定用户并不是你的好友
     *          3  指定组不存在
     */
    int editFriendToGroup(Long userId, Long friendId, Integer groupId);

    /**
     * 修改好友的备注信息
     * @param userId 用户id
     * @param friendId 好友的id
     * @param markName 指定的好友的备注信息
     * @return
     *          0  修改失败
     *          1  修改成功
     *          2  指定用户并不是你的好友
     */
    int editFriendMarkName(Long userId, Long friendId, String markName);

    /**
     * 修改好友分组
     * @param userId 用户id
     * @param groupId 用户分组id
     * @param groupName 用户分组名称
     * @return 数据库执行结果
     *         0 修改失败
     *         1 修改成功
     *         2 好友分组不存在
     */
    int updateGroupName(Long userId, Integer groupId, String groupName);

    /**
     * 删除好友分组
     * @param userId 用户id
     * @param groupId 用户分组id
     * @return 数据库执行结果
     *         0 删除失败
     *         1 删除成功
     *         2 好友分组不存在
     */
    int delGroup(Long userId, Integer groupId);

    /**
     * 查询用户的所有好友
     * @param userId 用户id
     * @return 好友列表
     */
    List<FriendVO> findFriends(Long userId);
}

